package com.amigo.online.provider.user.mongo.dao;

import java.util.List;
import java.util.Set;

import org.bson.Document;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.amigo.online.common.param.dto.user.ProbePeopleDto;
import com.amigo.online.provider.user.mongo.entity.UserEntity;
import com.mongodb.BasicDBObject;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCursor;

public interface UserDao {

    public void saveUser(UserEntity user);

    public Long updateUser(UserEntity user);

    public void deleteUserById(Long id);

    public UserEntity getUserById(Long id);

    /**
     * 功能:
     * <p>作者 zhaox 2018年7月12日 上午9:43:59
     *
     * @param point               坐标点
     * @param query               查询条件
     * @param page                展示页数
     * @param distance            距离
     * @param collection          集合名
     * @param List<BasicDBObject> 查询结果映射
     * @return
     */
    AggregateIterable<Document> findAroundPeople(String collection, Double[] point, int distance, BasicDBObject query, List<BasicDBObject> pipeline);

    public List<UserEntity> getUsersByIds(List<Long> ids);

    AggregateIterable<Document> findLocationById(List<Long> ids, String collection, List<BasicDBObject> pipeline);

    /**
     * 功能:更新用户坐标点
     * <p>作者 zhaox 2018年8月28日 上午11:21:31
     *
     * @param update
     */
    long updateUserInfo(Query query, Update update);

    /**
     * 快速匹配
     *
     * @param probePeopleDto
     * @return
     */
    MongoCursor<Document> probePeople(ProbePeopleDto probePeopleDto, Long userId, Set<Long> idList, int likeMe);

    /**
     * 喜欢我的用户
     * */
    MongoCursor<Document> probePeopleLikeMe(ProbePeopleDto probePeopleDto, Long userId, Set<Long> idList, List<Long> likeMe);

    public Long updateLastLoginTime(UserEntity user);

    /**
     * @throws
     * @Title: updateUserInfo
     * @Description: (根据用户ID, 更新用户部分信息)
     * @param: @param id
     * @param: @param update
     * @param: @return
     * @return: long
     */
    long updateUserInfo(long id, Update update);

}
